home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 25 / AMIGAplus Sonderheft 25 (2000)(Falke)(DE)(Track 1 of 4)[!].iso / Updates / HD-Installer / jst_dev / sources / src / DiskTools / coredecode.asm < prev    next >
Assembly Source File  |  2000-04-12  |  3KB  |  171 lines

  1.     XDEF    _DecodeTrack
  2.     XDEF    DecodeTrack
  3.  
  4. SYNC_WORD =$8915
  5.  
  6. GETLONG:MACRO
  7.     movem.l    D3-D4,-(sp)
  8.     move.l    (A0)+,\1    ; higher part (dest register)
  9.     move.l    (A0),D3
  10.     lsr.l    D5,D3        ; shift lower part with count
  11.     moveq    #$20,D4
  12.     sub.l    D5,D4
  13.     lsl.l    D4,\1        ;higher part has to be shifted to fill
  14.     or.l    D3,\1        ;the rest-place, a longword has 20 bits
  15.     movem.l    (sp)+,D3-D4    
  16.     ENDM
  17.  
  18.  
  19.  
  20. start:
  21.     move.l    #dectrack,A0
  22.     move.l    #rawtrack,D0
  23.     bsr    DecodeTrack
  24.     rts
  25.  
  26. ; < D7-1: number of longwords to read
  27.  
  28. DecodeLong:
  29.     MOVEQ    #0,D6            ;2A2: 7C00
  30.     move.l    Shift,D5
  31. loop:
  32.     MOVE.L    (A0)+,D0        ;2A4: 2018
  33.     MOVE.L    (A0)+,D1        ;2A6: 2218
  34. ;    GETLONG    D0
  35. ;    GETLONG    D1
  36.     ANDI.L    #$55555555,D0        ;2A8: 028055555555
  37.     ANDI.L    #$55555555,D1        ;2AE: 028155555555
  38.     ADD.L    D0,D0            ;2B4: D080
  39.     OR.L    D1,D0            ;2B6: 8081
  40.     MOVE.L    D0,(A1)+        ;2B8: 22C0
  41.     ADD.L    D0,D6            ;2BA: DC80
  42.     DBF    D7,loop
  43.     RTS                ;2C0: 4E75
  44.  
  45. ResyncTrack:
  46.     move.l    RawBuffer(pc),A0
  47.     move.l    Shift(pc),D0
  48.     move.l    #$1850,D1
  49.     subq.l    #6,A0
  50.     lea    synctrack,A1
  51. st_loop:
  52.     move.l    (A0),D2
  53.     lsr.l    D0,D2
  54.     addq.l    #2,A0
  55.     move.w    D2,(A1)+
  56.     dbf    D1,st_loop
  57.     rts
  58.  
  59. ; ** C entrypoint
  60.  
  61. _DecodeTrack:
  62.     move.l    4(A7),D0    ; raw buffer
  63.     move.l    8(A7),A0    ; destination (decoded)
  64.  
  65. ; ** assembly entrypoint
  66.  
  67. DecodeTrack:
  68.     movem.l    D1-A6,-(sp)
  69.  
  70.     move.l    A0,A1    ; dec
  71.     move.l    D0,A0    ; raw
  72.  
  73.     bsr    GetSync
  74.     tst.l    D0
  75.     bne    syncerr
  76.  
  77.     move.l    A1,DecodedBuffer
  78.     move.l    A0,RawBuffer
  79.     move.l    D1,Shift
  80.  
  81.     bsr    ResyncTrack
  82.  
  83.     lea    synctrack,A0
  84.     addq.l    #4,A0
  85.  
  86.     move.l    DecodedBuffer,A1
  87.     moveq.l    #0,D7
  88.     bsr    DecodeLong
  89.     move.l    D6,Checksum
  90.  
  91.     move.l    DecodedBuffer,A1
  92.     move.l    #$57F,D7
  93.     bsr    DecodeLong
  94.  
  95.     cmp.l    Checksum,D6
  96.     bne    decodeerr
  97.     moveq.l    #0,D0
  98.  
  99. exit
  100.     movem.l    (sp)+,D1-A6
  101.     rts
  102.  
  103.  
  104. decodeerr
  105.     moveq    #1,D0
  106.     bra    exit
  107.  
  108. syncerr
  109.     moveq    #2,D0
  110.     bra    exit
  111.  
  112.  
  113. GetSync:
  114.     movem.l    D2-D6/A1-A6,-(sp)
  115.  
  116.     MOVE.L    A0,A2
  117.     lea    $7C00(A2),A4        ;end of rawtrack
  118.  
  119. .SHF2    MOVEQ.L    #$10-1,D5
  120.  
  121.     ; *** try to find the sync shift (0 to 15)
  122.  
  123. .SHF1    MOVE.L    (A2),D0        ; a longword of data
  124.     LSR.L    D5,D0        ; shift it by D5
  125.     CMP.W    #SYNC_WORD,D0    ; sync?
  126.     BEQ.S    .SY        ; yes: found sync AND shift
  127.     DBF    D5,.SHF1
  128.     ADDQ.L    #2,A2
  129.     cmp.l    A2,A4
  130.     beq    ErrorSyn
  131.     BRA.S    .SHF2
  132.  
  133.     ; ** shift has been found, sync too.
  134.  
  135. .SY    MOVE.L    (A2),D0
  136.     ADDQ.L    #2,A2
  137.     LSR.L    D5,D0            ;d5 is the shifting-number when sync was found
  138.     CMP.W    #SYNC_WORD,D0
  139.     BNE.S    .SY
  140.  
  141. .1    MOVE.L    (A2),D0
  142.     ADDQ.L    #2,A2
  143.     LSR.L    D5,D0
  144.     CMP.W    #SYNC_WORD,D0
  145.     BEQ.S    .1
  146.  
  147.     moveq    #0,D0
  148.     move.l    A2,A0    ; buffer synced
  149.     move.l    D5,D1    ; shift
  150.     bra    ExitSyn
  151.  
  152. ErrorSyn:
  153.     moveq    #-1,D0
  154. ExitSyn
  155.     movem.l    (sp)+,D2-D6/A1-A6
  156.     rts
  157. RawBuffer:
  158.     dc.l    0
  159. DecodedBuffer:
  160.     dc.l    0
  161. Shift:
  162.     dc.l    0
  163. Checksum:
  164.     dc.l    0
  165. dectrack:
  166. ;    blk.b    $1900,0
  167. rawtrack:
  168. ;    incbin    "jag"
  169. synctrack:
  170.     blk.w    $1880,0
  171.